/**
 * 
 */
package com.bbva.gptf.back.transformador;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;

import com.bbva.gptf.dto.bean.Posicion;
import com.bbva.gptf.dto.bean.ReportePosicion;

/**
 * @author jrojasbe
 * 
 */
public class TransformadorReportePosicion implements
		Converter<Posicion, ReportePosicion> {

	private static final NumberFormat FORMATODECIMAL = new DecimalFormat(
			"###,###,###,###,##0.00");
	private static final NumberFormat FORMATOMONEDA = new DecimalFormat(
			"$###,###,###,###,##0.00");
	private static final NumberFormat FORMATOENTERO = new DecimalFormat(
			"###,###,###,###,##0");
	private static final NumberFormat FORMATOPORCENTAJE = new DecimalFormat(
			"##0.00%");
	private static final NumberFormat FORMATOPORCENTAJENA = new DecimalFormat(
			"##0.00%");

	ReportePosicion reportePosicion;

	@Override
	public ReportePosicion convert(final Posicion posicion) {
		reportePosicion = new ReportePosicion();

		reportePosicion.setCdContrato(aEntero(posicion.getCdContrato()));
		reportePosicion.setCdEmisora(posicion.getCdEmisora());
		reportePosicion.setCdSerie(posicion.getCdSerie());
		reportePosicion.setCdValorBmv(posicion.getCdValorBmv());
		reportePosicion.setContDelta(posicion.getContDelta() != null ? posicion.
				getContDelta().toPlainString() : null);
		reportePosicion.setContDeltaActual(posicion.getContDeltaActual() != null
				? posicion.getContDeltaActual().toPlainString() : null);
		reportePosicion
				.setContDeltaBench(posicion.getContDeltaBench() != null ? posicion.
						getContDeltaBench().toPlainString() : null);
		reportePosicion.setContDeltaPortafolio(posicion.getContDeltaPortafolio() != null ?
				posicion.getContDeltaPortafolio().toPlainString() : null);
		reportePosicion.setCtTitulos(posicion.getCtTitulos() != null ?
				posicion.getCtTitulos().toPlainString() : null);
		reportePosicion.setDeltaActual(posicion.getDeltaActual() != null
				? posicion.getDeltaActual().toPlainString() : null);
		reportePosicion.setDeltaBench(posicion.getDeltaBench() != null ? posicion.
				getDeltaBench().toPlainString() : null);
		reportePosicion.setDeltaOperaciones(posicion.getDeltaOperaciones() != null
				? posicion.getDeltaOperaciones().toPlainString() : null);
		reportePosicion.setDifVsBench(posicion.getDifVsBench() != null
				? posicion.getDifVsBench().toPlainString() : null);
		reportePosicion.setImPrecio(StringUtils.isBlank(posicion.getImPrecio()) ? null : posicion.getImPrecio());
		reportePosicion.setImvaluacion(posicion.getImvaluacion() != null ? posicion.
				getImvaluacion().toPlainString() : null);
		reportePosicion.setImValuacionDia(posicion.getImValuacionDia() != null ?
				posicion.getImValuacionDia().toPlainString() : null);
		reportePosicion.setIntegracion(StringUtils.isBlank(posicion.getIntegracion()) ? null : posicion.getIntegracion());
		reportePosicion.setMontoOperaciones(posicion.getMontoOperaciones() != null ?
				posicion.getMontoOperaciones().toPlainString() : null);
		reportePosicion.setNuDelta(posicion.getNuDelta() != null ? posicion.
				getNuDelta().toPlainString() : null);
		reportePosicion.setNuNivel(posicion.getNuNivel() != null ? posicion.getNuNivel().
				toPlainString() : null);
		reportePosicion.setPcIntegracion(posicion.getPcIntegracion() != null ?
				posicion.getPcIntegracion().toPlainString() : null);
		reportePosicion.setPcIntegracionBench(posicion.getPcIntegracionBench() != null ?
				posicion.getPcIntegracionBench().toPlainString() : null);
		reportePosicion.setPcIntegracionDia(posicion.getPcIntegracionDia() != null ?
				posicion.getPcIntegracionDia().toPlainString() : null);
		reportePosicion.setPcTasa(StringUtils.isBlank(posicion.getPcTasa()) ? null : posicion.getPcTasa()); 
		reportePosicion.setSaldoEfectivo(StringUtils.isBlank(posicion.getSaldoEfectivo()) ? null : posicion.getSaldoEfectivo());
		reportePosicion
				.setSubSobreDeltas(posicion.getSubSobreDeltas() != null ?
						posicion.getSubSobreDeltas().toPlainString() : null);
		reportePosicion.setSubSobrePonderacion(posicion.getSubSobrePonderacion() != null
				? posicion.getSubSobrePonderacion().toPlainString() : null);	
		reportePosicion.setImPrecioInicio(StringUtils.isBlank(posicion.getImPrecioInicio()) ? null : posicion.getImPrecioInicio());
		reportePosicion.setImPrecioDia(StringUtils.isBlank(posicion.getImPrecioDia()) ? null : posicion.getImPrecioDia());
		reportePosicion.setCtTituloDia(posicion.getCtTituloDia() != null
				? posicion.getCtTituloDia().toPlainString() : null);
		reportePosicion.setCtTituloOperaciones(posicion.getCtTituloOperaciones() != null
				? posicion.getCtTituloOperaciones().toPlainString() : null);
		reportePosicion.setSaldoEfectivoHoy(StringUtils.isBlank(posicion.getSaldoEfectivoHoy()) ? null : posicion.getSaldoEfectivoHoy());
		
		return reportePosicion;
	}

	private String aEntero(final BigDecimal valor) {
		try {
			return FORMATOENTERO.format(valor.doubleValue());
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

	private String aMdp(BigDecimal valor) {
		try {
			/*valor = valor.divide(new BigDecimal(1000000.00), 2,
					BigDecimal.ROUND_HALF_UP);*/
			valor=valor.divide(new BigDecimal(1000000.00));
			//return "$".concat(String.valueOf(valor));
			return FORMATOMONEDA.format(valor.doubleValue());
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

	private String aPorcentaje(final BigDecimal valor) {
		try {
			return FORMATOPORCENTAJE.format(valor.doubleValue());
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

	private String aPorcentajeNa(final BigDecimal valor) {
		try {
			return FORMATOPORCENTAJENA.format(valor.doubleValue() / 100);
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

	private String aMoneda(final BigDecimal valor) {
		try {
			return FORMATOMONEDA.format(valor.doubleValue());
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

	private String aNumero(final BigDecimal valor) {
		try {
			return FORMATODECIMAL.format(valor.doubleValue());
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}
	
	private String aMoneda(final String valor) {
		try {
			return FORMATOMONEDA.format(Double.parseDouble(valor));
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}
	
	private String aPorcentajeNa(final String valor) {
		try {
			return FORMATOPORCENTAJENA.format(Double.parseDouble(valor) / 100);
		} catch (final IllegalArgumentException e) {
			return "";
		}
	}

}
